## `summarise()` has grouped output by 'seller_id', 'order_id'. You can override
## using the `.groups` argument.
## Warning: There was 1 warning in `summarise()`.
## ℹ In argument: `across(-geolocation_city, mean, na.rm = TRUE)`.
## ℹ In group 1: `geolocation_zip_code_prefix = 1001`, `geolocation_state = "SP"`.
## Caused by warning:
## ! The `...` argument of `across()` is deprecated as of dplyr 1.1.0.
## Supply arguments directly to `.fns` through an anonymous function instead.
## 
##   # Previously
##   across(a:b, mean, na.rm = TRUE)
## 
##   # Now
##   across(a:b, \(x) mean(x, na.rm = TRUE))
## `summarise()` has grouped output by 'geolocation_zip_code_prefix'. You can
## override using the `.groups` argument.

Resumo

O comércio eletrônico no Brasil experimentou um crescimento significativo nas últimas décadas, tornando-se uma parte essencial do cenário de varejo do país. Com uma população numericamente grande e uma economia em crescimento, o Brasil viu um aumento notável nas transações de comércio eletrônico. Milhões de brasileiros agora preferem fazer compras online, aproveitando a conveniência de encontrar uma ampla variedade de produtos e serviços sem sair de casa. Plataformas de comércio eletrônico e marketplaces desempenham um papel fundamental nesse ecossistema, conectando consumidores a uma vasta gama de vendedores e produtos.

Apesar dos desafios logísticos e de infraestrutura, o comércio eletrônico no Brasil continua a atrair investimentos e inovações. A base de dados “Brazilian E-Commerce Public Dataset by Olist” oferece insights valiosos sobre as transações e comportamento dos consumidores nesse mercado em constante evolução, permitindo análises detalhadas e tomada de decisões informadas.

A fim de entender melhor o comportamento do comércio eletrônico, o trabalho contempla análise com métodos estatísticos explicados na disciplina Regressão Linear, tais como análise descritiva de dados, análise de multicolineareida, entendimentos de valores influentes, verificação de parâmetros da tabela ANOVA, aplicação de teste de hipoteses como Kolmogorov-Smirnov, Breush-Pagan e seleção de modelos, na base de dados da Olist a fim de entender como se relaciona o preço do frete em decorrência de variáveis como tamanho e peso do produto entregue, distância entre compradores e vendedores, data da entrega, dentre outras.

Introdução

A análise preditiva desempenha um papel crucial na gestão eficaz das operações de comércio eletrônico, especialmente no que diz respeito ao cálculo de frete. A fim de entender melhor o comércio eletrônico brasileiro, foi encontrada a base de dados “Brazilian E-Commerce Public Dataset by Olist” que permite explorar e entender as complexas variáveis que influenciam o custo de frete no contexto do comércio eletrônico no Brasil.

Sendo o frete é um dos principais fatores que impactam a experiência do cliente e os custos operacionais das empresas de comércio eletrônico. Torna-se aprazível buscar calcular da maneira objetiva o custo do frete envolvendo várias variáveis interconectadas, como a quantidade de produtos entregues, o valor do pedido do produto, o volume do pedido, a distância da entrega, a quantidade de dias para entregar o produto e o peso do produto.

Nesse cenário complexo, a regressão linear surge como uma ferramenta para prever os custos de frete com base nessas variáveis. Através da análise preditiva, podemos tentar explorar as relações entre essas variáveis e os custos de frete, identificando tendências e padrões que podem ajudar a tomada de decisões mais clarividentes.

Através da análise de dados da base: “Brazilian E-Commerce Public Dataset by Olist”, é possível entender e justificar a aplicação da análise preditiva por regressão linear a fim de estimar os custos de frete no contexto do comércio eletrônico brasileiro. Com essas estimativas pretende-se fornecer insights valiosos que buscam otimizar processos logísticos, melhorando a satisfação do cliente para que haja a tomada de decisões estratégicas baseadas em dados sólidos.

Durante o curso deste trabalho, iremos analisar cuidadosamente as variáveis disponíveis na base de dados, construir modelos de regressão linear e avaliar sua eficácia na previsão dos custos de frete. Além disso, discutiremos como essa análise pode contribuir para a redução de custos operacionais e a otimização das operações de entrega.

Materiais e Métodos

Desenho do Estudo

Neste capítulo, detalharemos os materiais e métodos utilizados para desenvolver e analisar nosso modelo de regressão linear múltipla. O objetivo deste estudo é investigar as variáveis que influenciam o valor do frete a ser pago em um e-commerce brasileiro, considerando dados de pedidos realizados entre 2016 e 2018, com uma amostra de cerca de 100.000 pedidos.

Coleta de Dados

Fonte de Dados

Os dados para este estudo foram obtidos do banco de dados de um market place brasileiro, que registra informações detalhadas sobre pedidos realizados entre 2016 e 2018, e disponibilizado na plataforma kaggle para fins de análise pública, através do link:https://www.kaggle.com/datasets/olistbr/brazilian-ecommerce. A fonte de dados foi selecionada devido à sua relevância, para os autores, por se tratar de um problema real, próximo da realidade profissional vivenciadas por eles, devido ao tamanho da base de dados, além de relevante para comunidade ter o entendimento dos fatores que afetam o valor do frete em transações online e uma projeção do quanto pagaria.

Figura 1: Esquemático relacional entre as bases de dados utilizada. Disponível em: https://www.kaggle.com/datasets/olistbr/brazilian-ecommerce

Descrição das bases de dados quem compõem o sistema da Figura 1:

  • Pedidos (Orders): Informações sobre os pedidos feitos pelos clientes, incluindo data do pedido, identificação do pedido, status do pedido e identificação do cliente.
  • Itens de Pedido (Order Items): Detalhes sobre os itens individuais dentro de cada pedido, incluindo identificação do produto, preço, quantidade, e o valor total do item.
  • Produtos (Products): Informações sobre os produtos disponíveis para compra, incluindo nome do produto, categoria, preço e peso.
  • Clientes (Customers): Dados sobre os clientes que fizeram os pedidos, incluindo identificação do cliente, nome, cidade e estado.
  • Pagamentos (Payments): Detalhes sobre os pagamentos associados a cada pedido, incluindo método de pagamento, valor do pagamento e parcelamento, quando aplicável.
  • Vendedores (Sellers): Informações sobre os vendedores que forneceram os produtos, incluindo identificação do vendedor, nome, cidade e estado.
  • Avaliações (Reviews): Avaliações e classificações dadas pelos clientes aos produtos e ao serviço de entrega.
  • Geolocalização (Geolocation): Dados de geolocalização que relacionam códigos postais às regiões geográficas no Brasil.
  • Categorias de Produtos (Product Categories): Informações sobre as categorias às quais os produtos pertencem.

Amostragem

Foram utilizados todos os pedidos observados no banco de dados, desde que tivesse sido “entregue”, não possuisse variáveis nulas ao fazer as combinações com as demais bases de dados, o peso do produto fosse maior que zero, o volume do produto fosse maior que zero, a distância entre vendedor e comprador fosse maior que zero e menor que a maior distancia em linha reta do Brasil (4.394 km), pedido que cujo pagamento não tivesse utilização de voucher. Com aplicação de todas estas restrições foram obtidas 94.995 observações para compor o modelo.

Variáveis

As variáveis utilizadas neste estudo incluem:

Variável Dependente (Y): Valor do Frete - Esta é a variável que pretendemos prever com base nas variáveis independentes.

Variáveis Independentes (X1, X2, X3, …): As variáveis explicativas incluem: - Caracteristicas do Pedido (por exemplo, valor total, quantidade de itens)

  • Características do Produto (Peso, volume).

  • Características do Cliente (por exemplo, cep, latitude e longitude).

  • Características do Vendedor (por exemplo, cidade, localização).

  • Distância entre CEPs do Cliente e do Vendedor.

  • Características de tempo (por exemplo, dia da semana da compra, época do ano).

Modelagem Estatística

Modelo de Regressão Linear Múltipla

Para realizar a análise, utilizamos um modelo de regressão linear múltipla. buscando encontrar uma equação para o modelo como a seguinte: Frete = β0 + β1X1 + β2X2 + … + βnXn + ε

Onde:

Frete é o valor do frete.

  • X1 ,X2 ,…,Xn representam as variáveis explicativas mencionadas anteriormente.
  • β0 é o intercepto.
  • β1 ,β2 ,…,βn são os coeficientes de regressão das variáveis independentes.
  • ε é o termo de erro

Neste estudo, foi aplicado o método stepwise para seleção de variáveis no modelo. O método stepwise nos permitiu avaliar e selecionar automaticamente as variáveis independentes mais relevantes com base em critérios estatísticos, incluindo o critério BIC (Bayesian Information Criterion). O critério BIC é particularmente útil, pois considera tanto a qualidade de ajuste do modelo quanto a complexidade, ajudando a evitar a inclusão de variáveis desnecessárias e, assim, melhorar a generalização do modelo.

Além disso, foi conduzida uma análise de multicolinearidade entre as variáveis independentes. A multicolinearidade ocorre quando duas ou mais variáveis independentes estão altamente correlacionadas, o que pode prejudicar a interpretação dos coeficientes e a estabilidade do modelo. Durante a análise, identificamos e tratamos a multicolinearidade, quando necessário, para garantir que as variáveis independentes fossem independentes umas das outras.

Adicionalmente, foi realizada uma análise de interação entre variáveis do tipo categóricas (como período do ano da entrega) e variáveis numéricas (Distância entre CEPs). Isso nos permitiu explorar se as relações entre essas variáveis eram afetadas por fatores adicionais, como o tipo de cliente ou a distância geográfica. A inclusão de termos de interação no modelo nos ajudou a capturar essas complexas relações.

Esta abordagem abrangente de seleção de variáveis, análise de multicolinearidade e consideração de interações entre variáveis contribuiu para a construção de um modelo de regressão linear múltipla mais preciso e interpretável, permitindo uma análise mais aprofundada dos determinantes do valor do frete em nosso e-commerce brasileiro.

Pré-processamento de Dados

Antes de ajustar o modelo de regressão linear múltipla, realizamos um rigoroso pré-processamento dos dados para garantir a qualidade e a integridade das informações.

  • Tratamento de Dados Ausentes: Inicialmente, identificamos e tratamos dados ausentes em todas as variáveis. Isso envolveu a remoção de observações com valores ausentes ou preenchimento desses valores com técnicas apropriadas, como média ou mediana, quando aplicável.

  • Cálculo da Distância entre CEPs: Para incorporar a distância entre o vendedor e o comprador como uma variável independente no modelo, calculamos a distância geodésica entre dois pontos globais usando suas coordenadas de latitude e longitude. Isso nos permitiu quantificar a distância física entre o vendedor e o comprador para análise.

  • Agregação de Bases de Dados:

  • Geolocalização: Para incorporar informações geográficas relevantes, agregamos a base de dados de Geolocalização, calculando a latitude e a longitude média de cada CEP. Isso nos forneceu coordenadas geográficas mais precisas para análise.

  • OrdersItems: Agregamos a base de dados OrdersItems somando a quantidade de itens por pedido. Isso nos permitiu considerar o volume total de itens em cada pedido como uma variável independente no modelo.

O pré-processamento de dados foi uma etapa crítica para garantir que os dados fossem adequados para a modelagem de regressão e que as informações importantes fossem devidamente incorporadas. Essas transformações e agregações forneceram uma base sólida para a análise estatística e a construção do modelo de regressão linear múltipla.

Software e Pacotes

Para conduzir a análise estatística e a construção do modelo de regressão linear múltipla, utilizamos a linguagem de programação R juntamente com o ambiente de desenvolvimento integrado RStudio. Essas ferramentas forneceram uma plataforma robusta para a análise de dados e modelagem estatística.

Além disso, foram empregados diversos pacotes de R para realizar tarefas específicas, incluindo, mas não se limitando a:

  • car: Utilizado para realizar testes de multicolinearidade, bem como outras análises estatísticas.
  • rgl: Usado para visualizações tridimensionais, quando necessário.
  • leaps: Utilizado para realizar a seleção de variáveis com base em critérios como BIC, parte do método stepwise.
  • lmtest: Possibilitou a realização de testes de hipóteses relacionados ao modelo de regressão linear múltipla.
  • olsrr: Forneceu uma série de funções úteis para a análise de regressão, incluindo diagnósticos de resíduos e medidas de ajuste do modelo.
  • dplyr: Facilitou a manipulação e transformação eficiente de dados.
  • ggplot2: Utilizado para criar visualizações gráficas de alta qualidade.
  • lubridate: Auxiliou no trabalho com datas e horários, como a análise de época do ano.
  • geosphere: Usado para calcular distâncias geodésicas entre coordenadas de latitude e longitude.
  • tidyverse: Uma coleção abrangente de pacotes para manipulação de dados, visualização e modelagem estatística.
  • corrplot: Utilizado para criar gráficos de matriz de correlação.
  • nortest: Usado para realizar testes de normalidade nos resíduos do modelo.

Esses pacotes desempenharam papéis cruciais ao longo da análise, desde a exploração inicial dos dados até a construção e avaliação do modelo de regressão linear múltipla. A escolha dessas ferramentas e pacotes específicos contribuiu para uma análise eficiente e completa dos dados do e-commerce brasileiro.

Análises e Resultados

Análise Exploratória de Dados

Nesta seção, foi feita uma análise exploratória das variáveis numéricas que compõem o conjunto de dados. Essa etapa é fundamental para compreender a distribuição das variáveis e suas relações com a variável resposta, o valor do frete.

Variável qty_product

  • Medidas de Posição: A média da quantidade de produtos (qty_product) foi de 1,148, com um desvio padrão de 0,56, baixa dispersão dos dados.
summary(dfNum$qty_product) #Medidas de Posicao #Q3 - Em um produto
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   1.000   1.000   1.148   1.000  21.000
sd(dfNum$qty_product)   
## [1] 0.5600883
  • Histograma: O histograma da variável qty_product mostra uma distribuição assimétrica com forte cauda à diteira, evidenciando que a maioria dos pedidos envolve menos de 3 ítens.
hist(dfNum$qty_product)    #Histograma - Observa-se que a imensa maioria dos pedidos tem um produto apenas

- Box Plot: O box plot revela a presença de alguns outlier, mas reforça a esmagadora concentração nos pedidos com baixa quantidade de produtos.

boxplot(dfNum$qty_product) #Box-plot - ratifica o ponto acima

- Correlação de Pearson: A correlação de Pearson foi de 0,35, indicando uma correçação positiva fraca entra as variáveis (frete e quantidade de produtos)

with(dfNum, cor(qty_product, total_freight, method="pearson")) #[1] 0.3500383
## [1] 0.3500383

Variável total_price

  • Medidas de Posição: O valor médio total_price foi de 133,46 reais, com um desvio padrão de 206,1 reais
summary(dfNum$total_price) #Medidas de Posicao - Existe valores de pedidos muito alto - 13400 reais - uma observacao - valor quase o dobro da segunda maior
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##     0.85    44.99    82.99   133.46   149.00 13440.00
sd(dfNum$total_price)      #Desvio-padrao [1] 203.787
## [1] 206.0986
  • Histograma: O histograma da variável total_price mostra uma distribuição assimétrica com forte cauda à diteira, evidenciando que a maioria dos pedidos envolve menos de 1000 reais.
hist(dfNum$total_price)    #Histograma

- Box Plot: : box plot revela a presença de alguns outlier, mas reforça a esmagadora concentração nos pedidos de até 1000 reais.

boxplot(dfNum$total_price) #Box-plot  

- Correlação de Pearson: A correlação de Pearson entre total_price e total_freight foi de 0,41, indicando correlção positiva moderada.

with(dfNum, cor(total_price, total_freight, method="pearson")) #[1] 0.4074545  
## [1] 0.4074545

Variável volume

  • Medidas de Posição: O valor médio do volume foi de 15.190 centimetros cubico (cm3), com um desvio padrão de 23.355,12 cm3, indicando alta dispersão dos dados.
summary(dfNum$volume) #Medidas de Posicao
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     168    2816    6384   15190   18375  296208
sd(dfNum$volume)      #Desvio-padrao [1] 23267.38 - alta dispersao
## [1] 23355.12
  • Histograma: O histograma da variável volume indica [apresenta formato assimétrico com forte cauda à direita, com contratação de pedidos com volume até 50.000 cm3.
hist(dfNum$volume)    #Histograma     

- Box Plot: O box plot mostra presença de outilier, mas dados bem concentrados em pedidos até 50.000 cm3.

boxplot(dfNum$volume) #Box-plot 

- Correlação de Pearson: A correlação de Pearson entre volume e total_freight foi de 0,49, inficando correção moderada entre as variáveis. Uma das correlações mais altas encontradas neste estudo.

with(dfNum, cor(volume, total_freight, method="pearson")) #0.4998182
## [1] 0.4998182

Variável dist (distância entre CEPs)

  • Medidas de Posição: A média da distância entre CEPs foi de 434.215 metros ou 434,2 km, com um desvio padrão de 59.1850,6 m.
summary(dfNum$dist) #Medidas de Posicao 
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      51  186422  434215  600114  797852 3931806
sd(dfNum$dist)      #Desvio-padrao [1] 592318.2 - alta dispersao
## [1] 591850.6
  • Histograma: O histograma da variável dist se mostra assimétrico com cauda à direita.
hist(dfNum$dist)    #Histograma 

- Box Plot: O box plot mostra presença de alguns outliers, mas com p75 abaixo de 1.000. km

boxplot(dfNum$dist) #Box-plot - cerca de 4 observacoes muito distantes - mais de 8mil km de distancia - muito superior a distancia do brasil - Excluir observacoes

- Correlação de Pearson: A correlação de Pearson entre dist e total_freight foi de 0,32, indicando correlação fraca entre as variáveis.

with(dfNum, cor(dist, total_freight, method="pearson")) #0.3259257
## [1] 0.3259257

Variável tempoEntregaNum (tempo de entrega em dias)

  • Medidas de Posição: O valor médio do tempoEntregaNum foi de 10.17 dias, com um desvio padrão de 9.52 dias.
summary(dfNum$tempoEntregaNum) #Medidas de Posicao #Atencao para casos com mais de 120 dias de tempo de entrega - o estimado é 50 dias 
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##   0.5334   6.7169  10.1754  12.4994  15.5945 209.6286
sd(dfNum$tempoEntregaNum)      #Desvio-padrao [1] 9.524263
## [1] 9.522234
  • Histograma: O histograma da variável tempoEntregaNum se mostra assimétrico com cauda à direita, com concentratação de valor em até 50 dias.
hist(dfNum$tempoEntregaNum)    #Histograma

- Box Plot: O box plot apresena alguns outliers com p75 com tempo inferior a ~20.

boxplot(dfNum$tempoEntregaNum) #Box-plot

- Correlação de Pearson: A correlação de Pearson entre tempoEntregaNum e total_freight foi de 0,17, indicando correlação bem fraca entre as variáveis, a mais fraca encontrada.

with(dfNum, cor(tempoEntregaNum, total_freight, method="pearson"))
## [1] 0.1785367

Variável product_weight_g (peso do produto em gramas)

  • Medidas de Posição: O valor médio do product_weight_g foi de 700g, com um desvio padrão de 3754.12 g, indicando alta dispersão dos dados.
summary(dfNum$product_weight_g) #Medidas de Posicao
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       2     300     700    2100    1800   40425
sd(dfNum$product_weight_g)     
## [1] 3754.123
  • Histograma: O histograma da variável product_weight_g tem forma assimétrica com cauda à direita.
hist(dfNum$product_weight_g)    #Histograma - concentracao alta em produtos com ate 2kgs

- Box Plot: O box plot indica a presença clara de outlier no valor de peso ~30 kg e outros.

boxplot(dfNum$product_weight_g) #Box-plot existe um produto com mais de 40kg - atencao - produtos com 0 e 2g - estes tem erro na coleta de dados

- Correlação de Pearson: correlação de Pearson entre product_weight_g e total_freight foi de 0,52, indicado correlação moderada entre os dados, sendo a correlação de pearson mais alta.

with(dfNum, cor(product_weight_g, total_freight, method="pearson")) #0.5219245 
## [1] 0.5219245

Variável total_freight (Variável Resposta)

  • Medidas de Posição: A média do valor do frete (total_freight) foi de [valor médio], com um desvio padrão de [valor do desvio padrão].
summary(dfNum$total_freight)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    5.00   13.65   16.95   22.20   23.34 1794.96
sd(dfNum$total_freight) 
## [1] 20.56356
  • Histograma: O histograma da variável total_freight [descrever a forma da distribuição].
hist(dfNum$total_freight) 

- Box Plot: O box plot [indicar se há outliers ou assimetria na distribuição].

boxplot(dfNum$total_freight)

Correlação de Pearson entre Variáveis Explicativas e a Variável Resposta

Realizamos análises de correlação de Pearson individual entre cada uma das variáveis explicativas (qty_product, total_price, volume, dist, tempoEntregaNum, product_weight_g) e a variável resposta (total_freight). As correlações variaram de 0.178 a 0.522 e apresentaram correlações fracas ou moderadas com direção positiva, em todas as variaveis numericas testadas.

Essa análise exploratória de dados nos forneceu uma compreensão inicial das distribuições das variáveis, identificou possíveis outliers e nos permitiu avaliar a correlação entre as variáveis explicativas e a variável resposta, o que será fundamental para a construção e interpretação do modelo de regressão linear múltipla.

Análise de Interação entre Variáveis

Para investigar a possível interação entre as variáveis dist, total_price, volume e o fator periodo_ano_estima_entrega, realizamos uma análise de interação. Isso nos permitiu examinar se o efeito de uma variável numérica no valor do frete é modificado ou dependente do nível do fator de período do ano estimado de entrega.

  • Primeiro, examinamos a interação entre a distância entre CEPs (variável dist) e o fator periodo_ano_estima_entrega. Para isso, criamos gráficos de dispersão separados para cada nível do fator de período e colorimos os pontos de acordo com a distância entre CEPs. Isso nos permitiu visualizar se a relação entre a distância e o valor do frete variava entre os períodos do ano estimado de entrega. Neste gráfico vê-se as linhas que representam os trimestres todas sobrepostas, concluindo então que não há interação entre as variáveis dist (distancia entre cep do comprador e vendedor) e a epoca do ano que se estima entregar o produto.
ggplot(dfNum, aes(x = dist, y = total_freight, color=periodo_ano_estima_entrega)) +    #Plota grafico
  geom_point(size=2, shape=16) +                           #Muda padrao dos pontos  
  scale_color_manual(values=c("violetred", "royalblue", "green", "yellow")) +  #Muda cores
  geom_smooth(method = "lm", se=FALSE)#Coloca linhas - Nota-se uma interacao entre Volume e o periodo do ano que a entrega é feita
## `geom_smooth()` using formula = 'y ~ x'

  • Da mesma forma, realizamos uma análise de interação entre o preço total (variável total_price) e o fator periodo_ano_estima_entrega. Novamente, criamos gráficos de dispersão para cada nível do fator de período e colorimos os pontos de acordo com o preço total. Isso nos permitiu avaliar se a relação entre o preço total e o valor do frete variava em diferentes períodos do ano estimado de entrega. Já para a variável explicativa que representa o preço total (total_price), as linhas que represetam os trimestres tem inclinacoes diferentes, deste modo indica que há uma interação a ser considerada no modelo de regressão. Por exemplo, vemos que no terceiro trimestre os valores dos pedidos são mais caros que nos periodos anteriores.
ggplot(dfNum, aes(x = total_price, y = total_freight, color=periodo_ano_estima_entrega)) +    #Plota grafico
  geom_point(size=2, shape=16) +                           #Muda padrao dos pontos  
  scale_color_manual(values=c("violetred", "royalblue", "green", "yellow")) +  #Muda cores
  geom_smooth(method = "lm", se=FALSE)#Coloca linhas - Nota-se uma interacao entre Volume e o periodo do ano que a entrega é feita
## `geom_smooth()` using formula = 'y ~ x'

  • A análise de interação também foi conduzida para a variável volume e o fator periodo_ano_estima_entrega. Utilizamos gráficos de dispersão para representar a relação entre o volume e o valor do frete, segmentados por níveis do fator de período. A coloração dos pontos foi baseada nos valores de volume. Ao analisar a variavel volume interagindo com periodo esperado para entrega, observa-se que alguns trimestres tem inclinações diferentes, que é o caso do terceiro e quarto, com maiores tamanhos volumétricos de pedidos, com o primeiro e segundo trimestre sendo compras de menor tamanho físico. E novamente, estas inclinações diferentes indicam que precisam ser testadas na modelagem estatística
ggplot(dfNum, aes(x = volume, y = total_freight, color=periodo_ano_estima_entrega)) +    #Plota grafico
  geom_point(size=2, shape=16) +                           #Muda padrao dos pontos  
  scale_color_manual(values=c("violetred", "royalblue", "green", "yellow")) +  #Muda cores
  geom_smooth(method = "lm", se=FALSE)#Coloca linhas - Nota-se uma interacao entre Volume e o periodo do ano que a entrega é feita
## `geom_smooth()` using formula = 'y ~ x'

Essa análise de interação entre as variáveis numéricas (dist, total_price, volume) e o fator periodo_ano_estima_entrega nos permitiu compreender melhor como essas variáveis podem influenciar de forma conjunta o valor do frete em diferentes momentos do ano estimado de entrega. Esses insights serão úteis para a construção de modelos de regressão mais precisos e para a interpretação dos resultados finais. Trazendo a necessidade de testar no modelo a interação entre total_price e volume com a variável (fator) periodo_ano_estima_entrega.

Elaboração do Modelo de Regressão

Para analisar os determinantes do valor do frete em nosso e-commerce brasileiro, realizamos uma modelagem de regressão linear múltipla. Utilizamos a linguagem de programação R com a função lm() para construir o modelo. A fórmula utilizada para o modelo foi a seguinte:

[lm(total_freight ~ product_weight_g + volume + dist + tempoEntregaNum + qty_product + total_price + factor(periodo_ano_estima_entrega) + volume:factor(periodo_ano_estima_entrega) + total_price:factor(periodo_ano_estima_entrega), data = dfNum)]

Nesta fórmula, total_freight é a variável dependente que estamos tentando prever, enquanto as outras variáveis são as variáveis independentes que consideramos relevantes com base na análise exploratória de dados. Vamos explicar cada parte da fórmula:

product_weight_g, volume, dist, tempoEntregaNum, qty_product e total_price são as variáveis numéricas que incluímos como preditores no modelo.

factor(periodo_ano_estima_entrega) representa o fator categórico que indica o período do ano estimado de entrega. Ele foi incluído no modelo para capturar as possíveis variações sazonais nas relações entre as variáveis independentes e a variável dependente.

As interações entre variáveis foram modeladas com volume:factor(periodo_ano_estima_entrega) e total_price:factor(periodo_ano_estima_entrega). Isso permite que o efeito das variáveis numéricas (volume e total_price) no valor do frete varie de acordo com o período do ano estimado de entrega.

Ao ajustar o modelo de regressão linear múltipla, consideramos a significância estatística dos coeficientes, a multicolinearidade entre as variáveis independentes e realizamos testes de hipóteses para avaliar a qualidade do ajuste do modelo.

Resultados da Modelagem

Os resultados da modelagem de regressão linear forneceram importantes insights sobre os determinantes do valor do frete em nosso e-commerce brasileiro. Alguns dos principais resultados incluem:

Efeito das Variáveis Numéricas: As variáveis numéricas, como o peso do produto (product_weight_g), o volume e o preço total, mostraram-se estatisticamente significativas na previsão do valor do frete. Isso sugere que aumentos nessas variáveis estão associados a aumentos ou diminuições no valor do frete, dependendo de suas direções de efeito.

Efeito do Período do Ano Estimado de Entrega: A inclusão do fator categórico do período do ano estimado de entrega revelou variações sazonais nas relações entre as variáveis independentes e o valor do frete. Isso indica que o período do ano pode influenciar a dinâmica dos custos de frete.

Interações Significativas: As interações entre as variáveis numéricas (volume e preço total) e o fator do período do ano estimado de entrega foram estatisticamente significativas. Isso significa que o efeito dessas variáveis na determinação do valor do frete pode variar sazonalmente.

Esses resultados são fundamentais para entender como as características dos produtos, as distâncias entre CEPs, os tempos de entrega e os preços afetam o valor do frete em nosso e-commerce brasileiro. Eles também fornecem informações valiosas para a tomada de decisões e estratégias de preços sazonais. A seguir, apresentaremos uma interpretação mais detalhada dos coeficientes e medidas de ajuste do modelo.

A seleção de variáveis é uma etapa crítica na construção de um modelo de regressão linear múltipla. O objetivo é identificar quais variáveis independentes são mais relevantes para prever a variável dependente, neste caso, o valor do frete (total_freight). Para realizar essa seleção de forma sistemática, utilizamos o método stepwise com o critério BIC.

foi usada a formula step(modelo_num, direction = ‘both’, k = log(n)) e com isto obtido o seguinte modelo:

modelo_num = lm(total_freight ~ product_weight_g+volume+dist+tempoEntregaNum+qty_product+total_price+factor(periodo_ano_estima_entrega)+volume:factor(periodo_ano_estima_entrega)+total_price:factor(periodo_ano_estima_entrega), data = dfNum)

Figura 2: Resultado do Modelo 1 No modelo 1, o R2 ajustado foi de 0.5618, e o termo do erro (sigma2) 185.2557. Fazendo a analise de VIF, não são observadas variaveis que tenham valor acima do treshold definido (5). Ou seja, pode-se continuar com todas as variáveis definidas. Observando o teste t, ao usar o comando summary(modelo1), ve-se que todas as variaveis tem p-valor abaixo de 5%, ou seja, devem fazer parte do modelo.

n <- nrow(dfNum)
#METODO DE SELECAO DE MODELO - USANDO BIC como critério
modelo_numStep <- step(modelo_num, direction = 'both',  k = log(n))
## Start:  AIC=496206.3
## total_freight ~ product_weight_g + volume + dist + tempoEntregaNum + 
##     qty_product + total_price + factor(periodo_ano_estima_entrega) + 
##     volume:factor(periodo_ano_estima_entrega) + total_price:factor(periodo_ano_estima_entrega)
## 
##                                                  Df Sum of Sq      RSS    AIC
## <none>                                                        17595400 496206
## - total_price:factor(periodo_ano_estima_entrega)  3     17001 17612401 496264
## - tempoEntregaNum                                 1     16297 17611698 496283
## - volume:factor(periodo_ano_estima_entrega)       3     94211 17689612 496679
## - product_weight_g                                1   1138206 18733607 502149
## - dist                                            1   3215040 20810440 512137
## - qty_product                                     1   4482452 22077852 517753
vif(modelo_num)
## there are higher-order terms (interactions) in this model
## consider setting type = 'predictor'; see ?vif
##                                                     GVIF Df GVIF^(1/(2*Df))
## product_weight_g                                2.953965  1        1.718710
## volume                                          6.459525  1        2.541559
## dist                                            1.206838  1        1.098562
## tempoEntregaNum                                 1.261367  1        1.123106
## qty_product                                     1.013721  1        1.006837
## total_price                                     6.169302  1        2.483808
## factor(periodo_ano_estima_entrega)              4.695082  3        1.294019
## volume:factor(periodo_ano_estima_entrega)      12.748137  3        1.528414
## total_price:factor(periodo_ano_estima_entrega) 15.273105  3        1.575147
summary(modelo_num)$adj.r.squared #[1] 0.5618984
## [1] 0.5618984
summary(modelo_num)
## 
## Call:
## lm(formula = total_freight ~ product_weight_g + volume + dist + 
##     tempoEntregaNum + qty_product + total_price + factor(periodo_ano_estima_entrega) + 
##     volume:factor(periodo_ano_estima_entrega) + total_price:factor(periodo_ano_estima_entrega), 
##     data = dfNum)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -248.62   -3.62    0.41    3.12 1618.20 
## 
## Coefficients:
##                                                       Estimate Std. Error
## (Intercept)                                         -7.795e+00  1.632e-01
## product_weight_g                                     1.585e-03  2.022e-05
## volume                                               1.324e-04  4.806e-06
## dist                                                 1.080e-05  8.197e-08
## tempoEntregaNum                                      4.885e-02  5.209e-03
## qty_product                                          1.235e+01  7.939e-02
## total_price                                          1.643e-02  5.322e-04
## factor(periodo_ano_estima_entrega)2 Tri              2.417e-01  1.583e-01
## factor(periodo_ano_estima_entrega)3 Tri              3.157e-01  1.571e-01
## factor(periodo_ano_estima_entrega)4 Tri             -5.319e-01  1.826e-01
## volume:factor(periodo_ano_estima_entrega)2 Tri       3.774e-05  5.498e-06
## volume:factor(periodo_ano_estima_entrega)3 Tri       1.181e-04  5.491e-06
## volume:factor(periodo_ano_estima_entrega)4 Tri       4.554e-05  6.350e-06
## total_price:factor(periodo_ano_estima_entrega)2 Tri  1.918e-03  6.637e-04
## total_price:factor(periodo_ano_estima_entrega)3 Tri  5.181e-03  6.651e-04
## total_price:factor(periodo_ano_estima_entrega)4 Tri -2.716e-05  7.300e-04
##                                                     t value Pr(>|t|)    
## (Intercept)                                         -47.763  < 2e-16 ***
## product_weight_g                                     78.384  < 2e-16 ***
## volume                                               27.546  < 2e-16 ***
## dist                                                131.737  < 2e-16 ***
## tempoEntregaNum                                       9.379  < 2e-16 ***
## qty_product                                         155.551  < 2e-16 ***
## total_price                                          30.867  < 2e-16 ***
## factor(periodo_ano_estima_entrega)2 Tri               1.527  0.12688    
## factor(periodo_ano_estima_entrega)3 Tri               2.010  0.04442 *  
## factor(periodo_ano_estima_entrega)4 Tri              -2.913  0.00358 ** 
## volume:factor(periodo_ano_estima_entrega)2 Tri        6.864 6.73e-12 ***
## volume:factor(periodo_ano_estima_entrega)3 Tri       21.510  < 2e-16 ***
## volume:factor(periodo_ano_estima_entrega)4 Tri        7.171 7.50e-13 ***
## total_price:factor(periodo_ano_estima_entrega)2 Tri   2.890  0.00386 ** 
## total_price:factor(periodo_ano_estima_entrega)3 Tri   7.790 6.76e-15 ***
## total_price:factor(periodo_ano_estima_entrega)4 Tri  -0.037  0.97033    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 13.61 on 94979 degrees of freedom
## Multiple R-squared:  0.562,  Adjusted R-squared:  0.5619 
## F-statistic:  8123 on 15 and 94979 DF,  p-value: < 2.2e-16
summary(modelo_num)$sigma^2 #185.2557    
## [1] 185.2557
#anova(modelo_num)

Figura 3: summary(modelo1) ### Analise de Resíduos

Após a construção do modelo de regressão linear múltipla, é fundamental realizar uma análise de resíduos para verificar se o modelo atende aos pressupostos da regressão linear e identificar possíveis problemas que possam afetar a qualidade das previsões.

Gráfico Quantil-Quantil (QQ Plot)

O gráfico QQ plot é uma ferramenta visual que compara os resíduos do modelo com uma distribuição teórica, geralmente a distribuição normal. Um QQ plot bem comportado exibirá pontos próximos a uma linha reta, indicando que os resíduos estão próximos de uma distribuição normal. Desvios significativos da linha reta podem sugerir desvios da normalidade.

residuos <- modelo_numStep$residuals   #Calcula o vetor de residuos 
preditos <- predict(modelo_numStep) #Calcula os valores preditos 
qqnorm(residuos) ; qqline(residuos)   #Grafico de probabilidade normal

No qqplot já é possivel observar a ausencia de normalidade dos resíduos, mas ainda sim é necessario realizar o teste de hipotese para tal

Teste de Kolmogorov-Smirnov (KS)

O teste de Kolmogorov-Smirnov é uma ferramenta estatística para verificar se os resíduos seguem uma distribuição normal. O teste compara a distribuição acumulada empírica dos resíduos com a distribuição acumulada teórica esperada (normal). Se o valor-p associado ao teste for significativo, isso indicará que os resíduos não seguem uma distribuição normal. Ao longo do curso foi usado o teste de Shapiro-wilk, porém no cenario observado pelos alunos tal ferramenta não pode ser utilizada, visto que o dataframe possui mais de 5000 observações, desta forma superando o limite máximo do teste. O p-valor do teste, um numero infinitamente pequeno, ratifica o fato observado no qqplot, que os residuos não seguem uma distribuição normal.

ks.test(residuos, "pnorm", mean=mean(residuos), sd=sd(residuos))
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  residuos
## D = 0.21774, p-value < 2.2e-16
## alternative hypothesis: two-sided

Teste de Breusch-Pagan para Homocedasticidade

A homocedasticidade refere-se à igualdade da variância dos resíduos em diferentes níveis das variáveis independentes. O teste de Breusch-Pagan é utilizado para verificar a homocedasticidade dos resíduos. Se o valor-p associado ao teste for significativo, isso sugere que a variância dos resíduos não é constante, o que pode indicar um problema de heterocedasticidade. Observando tanto o gráfico de Ajustados vs. Residuos, quanto o resultado do teste de Breush-pagan, vemos que os resudios nao tem homocedacidade, valor-p do teste, assim como visto no KS, é um numero muito pequeno o que faz rejeitar a hipotese nula.

plot(preditos, residuos, main="Ajustados vs. Residuos")  
abline(h=0)

bptest(modelo_numStep) #Breusch-Pagan teste (avalia homogeneidade da variancia dos erros quando explicativa e' quantativa)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_numStep
## BP = 910.42, df = 15, p-value < 2.2e-16

Avaliação da Ordem versus Resíduos

Além da análise visual e dos testes estatísticos, é importante avaliar a relação entre a ordem das observações e os resíduos. Se houver algum padrão nos resíduos em relação à ordem das observações, isso pode indicar a presença de autocorrelação nos resíduos, o que é um problema que pode afetar a validade das inferências do modelo. Com a base de dados e o modelo obtido, nesta primeira tantativa, nao é identificado anomalias quanto a ordem e resíduos.

plot(1:nrow(dfNum), residuos, main="Ordem vs. Residuos", xlab="Ordem") 
abline(h=0)

Como os resíduos observados não respeitam a distribuição normal e não são homocedásticos, é necessário seguir com a proposição para ajustes no modelo.

Transformação Box-Cox na Variável Dependente

A transformação Box-Cox é uma técnica estatística usada para lidar com variáveis dependentes que não atendem aos pressupostos da regressão linear, como normalidade e homocedasticidade. Esta transformação é aplicada à variável dependente (nesse caso, o valor do frete - total_freight) com o objetivo de tornar os resíduos mais próximos de uma distribuição normal, atendendo aos pressupostos da regressão linear.

Benefícios Esperados. Ao aplicar a transformação Box-Cox à variável dependente, esperamos obter os seguintes benefícios:

  • Melhoria na Normalidade: A transformação Box-Cox pode ajudar a tornar os resíduos mais próximos de uma distribuição normal. Isso é importante, pois muitos testes estatísticos e pressupostos da regressão linear dependem da normalidade dos resíduos.

  • Estabilização da Variância: Em alguns casos, a transformação Box-Cox pode ajudar a estabilizar a variância dos resíduos, tornando-os homocedásticos. Isso é importante para garantir que os erros de previsão não dependam do valor previsto.

  • Melhoria nas Propriedades Estatísticas: A transformação pode melhorar as propriedades estatísticas dos resíduos, como a independência e a distribuição normal, o que pode levar a intervalos de confiança e testes de hipóteses mais válidos.

Perda de Interpretação. No entanto, é importante observar que a transformação Box-Cox também possui algumas desvantagens:

  1. Perda de Interpretação Direta: A transformação Box-Cox altera a escala e a interpretação da variável dependente transformada. Isso significa que os coeficientes estimados no modelo transformado não podem ser diretamente interpretados em termos das unidades originais da variável. A interpretação dos resultados deve ser feita com base na escala transformada.

  2. Complexidade: A transformação Box-Cox introduz uma etapa adicional de complexidade no modelo, pois é necessário inverter a transformação para obter previsões na escala original, se necessário.

A decisão de aplicar a transformação Box-Cox deve ser baseada em evidências da análise de resíduos, como visto na subsessão anterior, a análise inicial dos resíduos revelou desvios significativos dos pressupostos da regressão linear, a transformação é ser uma opção. Com isto foi feito o modelo2, em que seguimos usando o método step-wise e BIC como critério para seleção de variáveis.

boxcox1 <- with(dfNum, boxCox(total_freight ~ product_weight_g+volume+dist+tempoEntregaNum+qty_product+total_price+factor(periodo_ano_estima_entrega)+volume:factor(periodo_ano_estima_entrega)+total_price:factor(periodo_ano_estima_entrega), 
                              lambda = seq(-5, 5, by=0.01), 
                              plotit=TRUE)) #Salvando os resultados numericos do boxcox

lambda <- boxcox1$x[which.max(boxcox1$y)] #Valor de 'lambda' que maximiza a 'profile log-likelihood'
print(lambda)
## [1] -0.1515152
dfNum$total_freight_boxcox <- (dfNum$total_freight^lambda - 1)/lambda

modelo_num2 <- lm(total_freight_boxcox ~ product_weight_g+volume+dist+tempoEntregaNum+qty_product+total_price+factor(periodo_ano_estima_entrega)+volume:factor(periodo_ano_estima_entrega)+total_price:factor(periodo_ano_estima_entrega), data=dfNum)
#METODO DE SELECAO DE MODELO - USANDO BIC como critério
modelo_numStep2 <- step(modelo_num2, direction = 'both',  k = log(n))
## Start:  AIC=-301860.8
## total_freight_boxcox ~ product_weight_g + volume + dist + tempoEntregaNum + 
##     qty_product + total_price + factor(periodo_ano_estima_entrega) + 
##     volume:factor(periodo_ano_estima_entrega) + total_price:factor(periodo_ano_estima_entrega)
## 
##                                                  Df Sum of Sq    RSS     AIC
## <none>                                                        3952.1 -301861
## - total_price:factor(periodo_ano_estima_entrega)  3      2.05 3954.1 -301846
## - volume:factor(periodo_ano_estima_entrega)       3      5.87 3958.0 -301754
## - tempoEntregaNum                                 1     54.05 4006.1 -300582
## - product_weight_g                                1    391.99 4344.1 -292889
## - qty_product                                     1    881.72 4833.8 -282741
## - dist                                            1   2002.84 5954.9 -262927
vif(modelo_num2)
## there are higher-order terms (interactions) in this model
## consider setting type = 'predictor'; see ?vif
##                                                     GVIF Df GVIF^(1/(2*Df))
## product_weight_g                                2.953965  1        1.718710
## volume                                          6.459525  1        2.541559
## dist                                            1.206838  1        1.098562
## tempoEntregaNum                                 1.261367  1        1.123106
## qty_product                                     1.013721  1        1.006837
## total_price                                     6.169302  1        2.483808
## factor(periodo_ano_estima_entrega)              4.695082  3        1.294019
## volume:factor(periodo_ano_estima_entrega)      12.748137  3        1.528414
## total_price:factor(periodo_ano_estima_entrega) 15.273105  3        1.575147

É observado um lambda = -0.1515152 (dízima periódica), o que torna complexa a interpretação da variável resposta, porém dado o p-valor muito pequeno, observado na primeira análise de resíduos, será adotado o valor de lambda na transformação exata, sem aproximações em uma primeira tentativa. Neste cenário transformado, obtemos um melhor ajuste do modelo, observando o R2 Ajustado, que sai de 0.52 para 0.64. Além disto, o termo do erro (sigma2) sai de 185.25, para 0.0416, uma drástica redução. É um ganho representativo, embora se perca a interpretabilidade, visto que o valor do frete agora precisa ser interpretado como Frete elevado a -0.1515152, subtraido de 1 e por fim, dividido por -0.1515152!

Nova analise de Residuos - Teste de Kolmogorov-Smirnov (KS)

Da mesma maneira que foi explicado na sessão anterior, foi realizado novamente, agora para o modelo2, o teste de Kolmogorov-Smirnov, para avaliar a normalidade dos resíduos do modelo obtido após transformação de box-cox da variavel dependente. E assim como no primeiro teste, pode-se rejeitar a hipótese nula de que os residuos do modelo2 respeitam uma distribuição normal.

residuos2 <- modelo_numStep2$residuals   #Calcula o vetor de residuos 
preditos2 <- predict(modelo_numStep2) #Calcula os valores preditos 
qqnorm(residuos2) ; qqline(residuos2)   #Grafico de probabilidade normal

ks.test(residuos2, "pnorm", mean=mean(residuos2), sd=sd(residuos2))
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  residuos2
## D = 0.053145, p-value < 2.2e-16
## alternative hypothesis: two-sided

####Nova analise de Residuos - Teste de Breusch-Pagan para Homocedasticidade Refeito o teste de Breusch-Pagan para avaliar a homocedacidade dos resíduos e a h0 segue sendo rejeitada, os resíduos obtidos a partir do modelo2 não possuem variância constante.

plot(preditos2, residuos2, main="Ajustados vs. Residuos")  
abline(h=0)

bptest(modelo_num2) #Breusch-Pagan teste (avalia homogeneidade da variancia dos erros quando explicativa e' quantativa)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_num2
## BP = 13849, df = 15, p-value < 2.2e-16

Nova analise de Residuos - Avaliação da Ordem versus Resíduos

Com a base de dados e o modelo obtido, na segunda tantativa, nao é identificado anomalias quanto a ordem e resíduos.

plot(1:nrow(dfNum), residuos, main="Ordem vs. Residuos", xlab="Ordem") 
abline(h=0)

Como os resíduos observados não respeitam a distribuição normal e não são homocedásticos, é necessário seguir com a proposição para ajustes no modelo, agora serão analisados e possívelmente removidos as observações de grande influência.

Análise de Observações Influentes

Após a tentativa de normalizar os resíduos por meio da transformação Box-Cox, é possível que ainda existam observações que tenham um impacto desproporcional nos resultados do modelo de regressão linear. Essas observações são chamadas de “observações influentes” e podem distorcer a análise estatística e as previsões do modelo. Os hat values são medidas que indicam o grau de influência de cada observação nos valores ajustados pelo modelo de regressão. Eles refletem o quanto cada observação se afasta da média dos valores das variáveis independentes. Observações com hat values altos têm um impacto maior nas estimativas dos coeficientes do modelo e, consequentemente, nas previsões. Para identificar observações influentes, foram calculados os hat values para cada observação em nosso conjunto de dados. Observações com hat values significativamente maiores do que a média dos hat values podem ser consideradas influentes.

Hii <- hatvalues(modelo_numStep2) 
boxplot(Hii)  

a.Hii <- dfNum$OBS[Hii > 4*p/n]
dfPontoAlav <- dfNum[a.Hii,]
head(dfPontoAlav)
##       customer_city customer_state total_price total_freight
## 2   santa fe do sul             SP      239.90         19.93
## 8      praia grande             SP      810.00         70.75
## 75   belo horizonte             MG      225.00         67.24
## 110        brasilia             DF      179.99         85.97
## 163        anapolis             GO      253.52         82.86
## 282      cosmopolis             SP     1050.61         25.13
##             seller_city seller_state product_category_name product_weight_g
## 2             sao paulo           SP              pet_shop            30000
## 8   presidente prudente           SP    ferramentas_jardim            13805
## 75              itatiba           SP                 bebes            23250
## 110     itaquaquecetuba           SP      moveis_decoracao            28600
## 163            ibitinga           SP      moveis_decoracao            19200
## 282           sao paulo           SP       cama_mesa_banho            18800
##     product_length_cm product_height_cm product_width_cm          dataPedido
## 2                  50                30               40 2017-04-26 10:53:06
## 8                  35                75               45 2018-07-04 12:08:27
## 75                 23                50               84 2018-03-25 16:52:27
## 110                41                43               91 2017-09-21 22:00:44
## 163                58                40               50 2017-11-06 15:42:42
## 282                40                30               50 2018-05-04 19:19:10
##     dataEstimada     dist volume tempoEntregaNum mes_pedido mes_estima_entrega
## 2     2017-05-15 586219.9  60000       16.216181          4                  5
## 8     2018-07-25 548720.3 118125        5.080324          7                  7
## 75    2018-04-20 449061.4  96600       21.949560          3                  4
## 110   2017-10-20 868688.3 160433       20.603646          9                 10
## 163   2017-11-29 604625.0 116000       15.140417         11                 11
## 282   2018-05-17 113864.7  60000       12.151100          5                  5
##     periodo_mes_pedido periodo_mes_estima_entrega periodo_ano_pedido
## 2           fim do mês                meio do mês              2 Tri
## 8        inicio do mês                 fim do mês              3 Tri
## 75          fim do mês                meio do mês              1 Tri
## 110        meio do mês                meio do mês              3 Tri
## 163        meio do mês                 fim do mês              4 Tri
## 282      inicio do mês                meio do mês              2 Tri
##     periodo_ano_estima_entrega diaSemana_pedido TipoDiaSemana_pedido
## 2                        2 Tri                4             dia util
## 8                        3 Tri                4             dia util
## 75                       2 Tri                1        fim de semana
## 110                      4 Tri                5             dia util
## 163                      4 Tri                2             dia util
## 282                      2 Tri                6             dia util
##     qty_product total_freight_boxcox OBS residuos r.stand r.stud r.stud.ext
## 2             1             2.405802   2  -54.138  -4.099 -4.101     -4.102
## 8             1             3.138356   8   -9.263   0.132  0.132      0.132
## 75            1             3.111565  75   -0.883   0.151  0.151      0.151
## 110           1             3.239058 110   -5.258  -1.293 -1.295     -1.295
## 163           1             3.220242 163   16.347   0.797  0.797      0.797
## 282           1             2.550573 282  -40.763  -2.154 -2.155     -2.155
##     r.press   Hii d.Cook df.beta0 df.beta1 df.beta2 df.beta3 df.beta4 df.beta5
## 2    -0.837 0.001  0.001   -0.002   -0.134    0.068   -0.002    0.002    0.000
## 8     0.027 0.001  0.000    0.000    0.000    0.000    0.000    0.000    0.000
## 75    0.031 0.001  0.000    0.000    0.002   -0.001    0.000    0.000    0.000
## 110  -0.264 0.003  0.000    0.000   -0.017    0.009   -0.002    0.001    0.000
## 163   0.163 0.001  0.000    0.001    0.006   -0.003    0.000   -0.001    0.000
## 282  -0.440 0.001  0.000   -0.004   -0.030    0.015    0.006    0.000    0.004
##     df.beta6 df.beta7 df.fits
## 2      0.014    0.003  -0.144
## 8      0.000    0.000   0.004
## 75     0.000    0.000   0.004
## 110    0.002    0.000  -0.069
## 163   -0.001    0.000   0.029
## 282    0.003    0.014  -0.065

Deste modo observa-se registros com alto grau de influencia, segundo convensão, toma-se hat values influentes quando Hii é maior que 2 vezes a razão entre quantidade de parâmetros sobre a quantidade da amostra, e neste estudo, para fins de conservadorismo e por ter o tamanho amostral de aproximadamente 95 mil, o que torna complexo e caro analisar individualmente as observações, priorizou-se as observações deveras influente.

Além dos hat values, também foram calculados e analisados os Resíduos Studentizados, que são resíduos que foram padronizados para terem uma média de 0 e um desvio padrão de 1. Isso os torna úteis para identificar observações que se desviam significativamente do padrão esperado. Os Resíduos Studentizados são frequentemente usados para verificar a presença de valores atípicos ou observações influentes. Valores absolutos dos Resíduos Studentizados significativamente maiores que 2 indicam observações que merecem uma análise mais aprofundada. Com esta caracteristicas sao identificados mais de 4300 observações.

boxplot(r.stud)

a.r.stud <- dfNum$OBS[abs(r.stud) > 2] 
#dfNum[a.r.stud,] #ponto de alavanca

dfRStud <- dfNum[a.r.stud,]
head(dfRStud)
##       customer_city customer_state total_price total_freight seller_city
## 2   santa fe do sul             SP      239.90         19.93   sao paulo
## 67        ituiutaba             MG      199.99         65.56   sao paulo
## 72     porto alegre             RS       44.90          7.16   sao paulo
## 91   rio de janeiro             RJ      138.00         37.16     guaruja
## 123  rio de janeiro             RJ      149.00         40.37    ilicinea
## 141       nilopolis             RJ      139.00         87.28   arapongas
##     seller_state  product_category_name product_weight_g product_length_cm
## 2             SP               pet_shop            30000                50
## 67            SP             cool_stuff             2050                40
## 72            SP             brinquedos              200                16
## 91            SP             perfumaria              250                16
## 123           MG informatica_acessorios             6550                20
## 141           PR                  bebes             4075                73
##     product_height_cm product_width_cm          dataPedido dataEstimada
## 2                  30               40 2017-04-26 10:53:06   2017-05-15
## 67                 40               30 2017-06-20 21:55:21   2017-07-12
## 72                  7               11 2017-08-04 09:19:10   2017-09-05
## 91                 10               11 2018-06-13 14:10:54   2018-07-20
## 123                20               20 2018-02-19 21:47:44   2018-03-14
## 141                14               48 2018-06-10 19:52:27   2018-07-16
##         dist volume tempoEntregaNum mes_pedido mes_estima_entrega
## 2   586219.9  60000       16.216181          4                  5
## 67  593807.9  48000        8.709884          6                  7
## 72  870113.5   1232        3.408565          8                  9
## 91  331550.4   1760        5.974780          6                  7
## 123 318392.9   8000       15.910301          2                  3
## 141 821947.0  49056        5.823854          6                  7
##     periodo_mes_pedido periodo_mes_estima_entrega periodo_ano_pedido
## 2           fim do mês                meio do mês              2 Tri
## 67         meio do mês                meio do mês              2 Tri
## 72       inicio do mês              inicio do mês              3 Tri
## 91         meio do mês                meio do mês              2 Tri
## 123        meio do mês                meio do mês              1 Tri
## 141        meio do mês                meio do mês              2 Tri
##     periodo_ano_estima_entrega diaSemana_pedido TipoDiaSemana_pedido
## 2                        2 Tri                4             dia util
## 67                       3 Tri                3             dia util
## 72                       3 Tri                6             dia util
## 91                       3 Tri                4             dia util
## 123                      1 Tri                2             dia util
## 141                      3 Tri                1        fim de semana
##     qty_product total_freight_boxcox OBS residuos r.stand r.stud r.stud.ext
## 2             1             2.405802   2  -54.138  -4.099 -4.101     -4.102
## 67            1             3.098166  67   34.259   3.227  3.227      3.227
## 72            2             1.702080  72  -21.216  -3.699 -3.699     -3.699
## 91            2             2.783602  91   12.251   2.138  2.138      2.138
## 123           1             2.831212 123   17.714   2.378  2.378      2.378
## 141           1             3.246750 141   51.501   3.472  3.472      3.473
##     r.press   Hii d.Cook df.beta0 df.beta1 df.beta2 df.beta3 df.beta4 df.beta5
## 2    -0.837 0.001  0.001   -0.002   -0.134    0.068   -0.002    0.002    0.000
## 67    0.658 0.000  0.000    0.002   -0.021    0.010    0.001   -0.002   -0.003
## 72   -0.755 0.000  0.000    0.008   -0.001    0.000   -0.010    0.011   -0.019
## 91    0.436 0.000  0.000   -0.004    0.000    0.000   -0.002   -0.001    0.010
## 123   0.485 0.000  0.000    0.011    0.018   -0.014   -0.004    0.002   -0.002
## 141   0.708 0.000  0.000    0.003   -0.012    0.006    0.008   -0.008   -0.003
##     df.beta6 df.beta7 df.fits
## 2      0.014    0.003  -0.144
## 67     0.002    0.000   0.039
## 72     0.001    0.001  -0.034
## 91     0.000    0.000   0.018
## 123    0.002   -0.010   0.025
## 141    0.001    0.000   0.040

Observando o boxplot de r.stud, é possivel notar que há residuos com valores acima e abaixo dos limites recomendados. E isto pode estar afetando o ajuste do modelo.

Remoção de Observações para Fins Didáticos

Em alguns casos, para fins didáticos e de simplificação da análise, é útil remover temporariamente observações influentes do modelo. Isso pode ajudar a identificar melhor o comportamento geral do modelo quando as observações problemáticas são removidas. No entanto, é importante ressaltar que a remoção de observações influentes não é recomendada em análises reais, a menos que haja uma justificativa substancial.

A remoção de observações com hat values altos pode ser realizada da seguinte forma:

  1. Identifique as observações com hat values altos, geralmente aquelas cujos hat values estão bem acima da média.

  2. Crie uma nova versão do conjunto de dados, excluindo essas observações.

  3. Realize uma análise separada com o conjunto de dados reduzido, observando as mudanças nos resultados do modelo, como coeficientes e estatísticas de ajuste.

  4. Compare os resultados entre o modelo completo e o modelo com observações influentes removidas para avaliar o impacto dessas observações no ajuste do modelo.

Desta forma, foram realizadas duas tentativas, uma removendo os Hat Values e outra removendo os Resíduos Studentizados, conforme regras supracitadas. Inicialmente testando a remoção dos Hat Values, tem-se o modelo 3, abaixo:

modelo_numStep3  <- update(modelo_numStep2, subset = -a.Hii)
summary(modelo_numStep3)$adj.r.squared 
## [1] 0.6243268
summary(modelo_numStep3)
## 
## Call:
## lm(formula = total_freight_boxcox ~ product_weight_g + volume + 
##     dist + tempoEntregaNum + qty_product + total_price + factor(periodo_ano_estima_entrega) + 
##     volume:factor(periodo_ano_estima_entrega) + total_price:factor(periodo_ano_estima_entrega), 
##     data = dfNum, subset = -a.Hii)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.83621 -0.11257  0.01048  0.10781  1.28712 
## 
## Coefficients:
##                                                       Estimate Std. Error
## (Intercept)                                          1.718e+00  2.792e-03
## product_weight_g                                     3.280e-05  3.524e-07
## volume                                               1.552e-06  9.423e-08
## dist                                                 2.650e-07  1.212e-09
## tempoEntregaNum                                      3.648e-03  8.498e-05
## qty_product                                          2.107e-01  1.464e-03
## total_price                                          5.067e-04  1.323e-05
## factor(periodo_ano_estima_entrega)2 Tri              2.384e-02  2.697e-03
## factor(periodo_ano_estima_entrega)3 Tri              4.649e-02  2.660e-03
## factor(periodo_ano_estima_entrega)4 Tri              3.577e-03  3.190e-03
## volume:factor(periodo_ano_estima_entrega)2 Tri       1.967e-08  1.105e-07
## volume:factor(periodo_ano_estima_entrega)3 Tri       1.251e-06  1.100e-07
## volume:factor(periodo_ano_estima_entrega)4 Tri       2.560e-07  1.350e-07
## total_price:factor(periodo_ano_estima_entrega)2 Tri -3.923e-05  1.668e-05
## total_price:factor(periodo_ano_estima_entrega)3 Tri  4.630e-06  1.658e-05
## total_price:factor(periodo_ano_estima_entrega)4 Tri  3.634e-06  1.997e-05
##                                                     t value Pr(>|t|)    
## (Intercept)                                         615.396   <2e-16 ***
## product_weight_g                                     93.075   <2e-16 ***
## volume                                               16.473   <2e-16 ***
## dist                                                218.639   <2e-16 ***
## tempoEntregaNum                                      42.923   <2e-16 ***
## qty_product                                         143.899   <2e-16 ***
## total_price                                          38.307   <2e-16 ***
## factor(periodo_ano_estima_entrega)2 Tri               8.840   <2e-16 ***
## factor(periodo_ano_estima_entrega)3 Tri              17.476   <2e-16 ***
## factor(periodo_ano_estima_entrega)4 Tri               1.121   0.2621    
## volume:factor(periodo_ano_estima_entrega)2 Tri        0.178   0.8587    
## volume:factor(periodo_ano_estima_entrega)3 Tri       11.369   <2e-16 ***
## volume:factor(periodo_ano_estima_entrega)4 Tri        1.896   0.0579 .  
## total_price:factor(periodo_ano_estima_entrega)2 Tri  -2.352   0.0187 *  
## total_price:factor(periodo_ano_estima_entrega)3 Tri   0.279   0.7800    
## total_price:factor(periodo_ano_estima_entrega)4 Tri   0.182   0.8556    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1934 on 91985 degrees of freedom
## Multiple R-squared:  0.6244, Adjusted R-squared:  0.6243 
## F-statistic: 1.019e+04 on 15 and 91985 DF,  p-value: < 2.2e-16
summary(modelo_numStep3)$sigma^2 
## [1] 0.03740126
vif(modelo_numStep3) 
## there are higher-order terms (interactions) in this model
## consider setting type = 'predictor'; see ?vif
##                                                     GVIF Df GVIF^(1/(2*Df))
## product_weight_g                                2.494287  1        1.579331
## volume                                          5.945162  1        2.438270
## dist                                            1.250247  1        1.118145
## tempoEntregaNum                                 1.312416  1        1.145607
## qty_product                                     1.009919  1        1.004947
## total_price                                     5.541007  1        2.353934
## factor(periodo_ano_estima_entrega)             13.109893  3        1.535559
## volume:factor(periodo_ano_estima_entrega)      16.988676  3        1.603344
## total_price:factor(periodo_ano_estima_entrega) 30.410114  3        1.766728

O modelo 3, sem os Hatvalues com valor acima do threshold determinado (4*p/n), tem o R2 ajustado de 0.624, inferior ao R2 ajustado que tinha no modelo 2, e o termo do erro em 0.037, ganho pouco significativo em relação ao modelo 2 que havia 0.042. No modelo 3 não se observa multicolinearidade e as variaveis selecionadas seguem sendo significativas para explicar o valor do frete. Por fim, ao realizar um teste KS para checar a normalidade dos resíduos do modelo 3, e a hipótese nula segue sendo rejeitada.

ks.test(modelo_numStep3$residuals, "pnorm", mean=mean(modelo_numStep3$residuals), sd=sd(modelo_numStep3$residuals))
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  modelo_numStep3$residuals
## D = 0.049399, p-value < 2.2e-16
## alternative hypothesis: two-sided

Uma segunda tentativa foi feita removendo observações cujo, Residuo Studentizado em modulo, fosse superior a 2, formando o modelo 3b:

modelo_numStep3b  <- update(modelo_numStep2, subset = -a.r.stud)
summary(modelo_numStep3b)$adj.r.squared #[1] 0.7414162 
## [1] 0.7414162
summary(modelo_numStep3b)
## 
## Call:
## lm(formula = total_freight_boxcox ~ product_weight_g + volume + 
##     dist + tempoEntregaNum + qty_product + total_price + factor(periodo_ano_estima_entrega) + 
##     volume:factor(periodo_ano_estima_entrega) + total_price:factor(periodo_ano_estima_entrega), 
##     data = dfNum, subset = -a.r.stud)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.85069 -0.10347  0.01324  0.10447  0.44836 
## 
## Coefficients:
##                                                       Estimate Std. Error
## (Intercept)                                          1.717e+00  2.107e-03
## product_weight_g                                     3.112e-05  2.720e-07
## volume                                               1.604e-06  6.282e-08
## dist                                                 2.755e-07  1.007e-09
## tempoEntregaNum                                      3.387e-03  6.676e-05
## qty_product                                          2.280e-01  1.128e-03
## total_price                                          2.975e-04  7.137e-06
## factor(periodo_ano_estima_entrega)2 Tri              2.100e-02  1.963e-03
## factor(periodo_ano_estima_entrega)3 Tri              4.565e-02  1.952e-03
## factor(periodo_ano_estima_entrega)4 Tri              3.928e-03  2.279e-03
## volume:factor(periodo_ano_estima_entrega)2 Tri      -5.426e-08  7.103e-08
## volume:factor(periodo_ano_estima_entrega)3 Tri       9.245e-07  7.172e-08
## volume:factor(periodo_ano_estima_entrega)4 Tri       3.191e-07  8.101e-08
## total_price:factor(periodo_ano_estima_entrega)2 Tri -1.067e-05  8.858e-06
## total_price:factor(periodo_ano_estima_entrega)3 Tri  6.317e-06  8.874e-06
## total_price:factor(periodo_ano_estima_entrega)4 Tri -1.105e-05  1.036e-05
##                                                     t value Pr(>|t|)    
## (Intercept)                                         814.822  < 2e-16 ***
## product_weight_g                                    114.412  < 2e-16 ***
## volume                                               25.534  < 2e-16 ***
## dist                                                273.552  < 2e-16 ***
## tempoEntregaNum                                      50.737  < 2e-16 ***
## qty_product                                         202.187  < 2e-16 ***
## total_price                                          41.691  < 2e-16 ***
## factor(periodo_ano_estima_entrega)2 Tri              10.700  < 2e-16 ***
## factor(periodo_ano_estima_entrega)3 Tri              23.384  < 2e-16 ***
## factor(periodo_ano_estima_entrega)4 Tri               1.723   0.0848 .  
## volume:factor(periodo_ano_estima_entrega)2 Tri       -0.764   0.4450    
## volume:factor(periodo_ano_estima_entrega)3 Tri       12.891  < 2e-16 ***
## volume:factor(periodo_ano_estima_entrega)4 Tri        3.938 8.21e-05 ***
## total_price:factor(periodo_ano_estima_entrega)2 Tri  -1.204   0.2284    
## total_price:factor(periodo_ano_estima_entrega)3 Tri   0.712   0.4766    
## total_price:factor(periodo_ano_estima_entrega)4 Tri  -1.066   0.2863    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1616 on 90608 degrees of freedom
## Multiple R-squared:  0.7415, Adjusted R-squared:  0.7414 
## F-statistic: 1.732e+04 on 15 and 90608 DF,  p-value: < 2.2e-16
summary(modelo_numStep3b)$sigma^2   
## [1] 0.02612802
anova(modelo_numStep3b)
## Analysis of Variance Table
## 
## Response: total_freight_boxcox
##                                                   Df  Sum Sq Mean Sq    F value
## product_weight_g                                   1 2361.24 2361.24  90371.956
## volume                                             1   55.28   55.28   2115.584
## dist                                               1 2854.17 2854.17 109238.010
## tempoEntregaNum                                    1   41.95   41.95   1605.475
## qty_product                                        1 1184.29 1184.29  45326.526
## total_price                                        1  234.58  234.58   8978.272
## factor(periodo_ano_estima_entrega)                 3   50.03   16.68    638.296
## volume:factor(periodo_ano_estima_entrega)          3    7.68    2.56     97.921
## total_price:factor(periodo_ano_estima_entrega)     3    0.17    0.06      2.143
## Residuals                                      90608 2367.41    0.03           
##                                                 Pr(>F)    
## product_weight_g                               < 2e-16 ***
## volume                                         < 2e-16 ***
## dist                                           < 2e-16 ***
## tempoEntregaNum                                < 2e-16 ***
## qty_product                                    < 2e-16 ***
## total_price                                    < 2e-16 ***
## factor(periodo_ano_estima_entrega)             < 2e-16 ***
## volume:factor(periodo_ano_estima_entrega)      < 2e-16 ***
## total_price:factor(periodo_ano_estima_entrega) 0.09251 .  
## Residuals                                                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
vif(modelo_numStep3b) 
## there are higher-order terms (interactions) in this model
## consider setting type = 'predictor'; see ?vif
##                                                     GVIF Df GVIF^(1/(2*Df))
## product_weight_g                                3.158691  1        1.777271
## volume                                          6.437413  1        2.537206
## dist                                            1.215481  1        1.102489
## tempoEntregaNum                                 1.272194  1        1.127916
## qty_product                                     1.012168  1        1.006066
## total_price                                     5.991190  1        2.447691
## factor(periodo_ano_estima_entrega)              5.474447  3        1.327568
## volume:factor(periodo_ano_estima_entrega)      12.543758  3        1.524303
## total_price:factor(periodo_ano_estima_entrega) 17.032601  3        1.604034

O modelo 3b, sem os registros cujo valor absoluto do Residuo Studentizado é maior que 2, trouxe um R2 Ajustado de 0.741, comparado ao 0.64, tem um ganho significativo além de uma redução no termo do erro, que sai de 0.037, para 0.026. Porém, a hipotese nula do teste de normalidade segue sendo rejeitada mais uma vez.

ks.test(modelo_numStep3b$residuals, "pnorm", mean=mean(modelo_numStep3b$residuals), sd=sd(modelo_numStep3b$residuals))
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  modelo_numStep3b$residuals
## D = 0.042652, p-value < 2.2e-16
## alternative hypothesis: two-sided

Vale ressaltar que em ambas as tentativas de modelos, partiram do modelo 2, onde fez-se a transformação de box-cox.

Foram analisados outros indicadores:

A Distância de Cook é uma métrica que avalia o impacto de cada observação nos coeficientes do modelo de regressão e nas previsões. Ela é calculada para cada observação e quantifica o quanto a previsão do modelo mudaria se a observação fosse removida do conjunto de dados. Em outras palavras, a Distância de Cook mede o quanto uma observação influencia o modelo. Observações com valores elevados de Distância de Cook podem ser consideradas influentes, pois têm um impacto desproporcional nas estimativas do modelo. Valores significativamente maiores que 1 indicam que a observação está exercendo uma influência substancial no modelo.

Os DFBETAS são estatísticas que medem o efeito de cada observação nos coeficientes do modelo. Eles indicam quanto a inclusão ou exclusão de uma observação altera os valores dos coeficientes. DFBETAS podem ser usados para identificar observações que têm um impacto substancial em um ou mais coeficientes. Valores absolutos de DFBETAS significativamente maiores que 1 indicam observações influentes.

Os DFBITs são semelhantes aos DFBETAS, mas medem o efeito de cada observação nos valores ajustados do modelo. Eles indicam quanto a inclusão ou exclusão de uma observação altera as previsões do modelo. DFBITs são úteis para identificar observações que têm um impacto substancial nas previsões do modelo. Valores absolutos de DFBITs significativamente maiores que 1 indicam observações influentes.

ols_plot_cooksd_bar(modelo_numStep2)

ols_plot_cooksd_chart(modelo_numStep2)

ols_plot_dfbetas(modelo_numStep2)

ols_plot_dffits(modelo_numStep2)

Os registros que tinham estes demais indicadores altos, tambem haviam sido observados com Hat Values ou Residuos Studentizados alto, desta maneira nao foi feita nenhuma outra tentativa de modelagem a partir de remoção de obervações influentes.

É importante notar que a remoção de observações influentes é uma medida extrema e deve ser feita com cautela. Em uma análise real, as observações não devem ser removidas a menos que haja uma razão substancial para fazê-lo, como a identificação de erros de medição evidentes ou valores atípicos que não fazem sentido no contexto do estudo.

A análise de observações influentes é uma etapa valiosa na avaliação da robustez do modelo de regressão, mas as conclusões e decisões devem ser baseadas em uma compreensão cuidadosa do conjunto de dados e do problema em questão.

Mesmo utilizando um apelo puramente didático, ainda não conseguiu-se chegar a um modelo cujos resíduos respeitem a distribuição normal, mais uma tentativa foi realizada.

Transformação das Variáveis Preditoras

Além de considerar a transformação da variável dependente (como discutido na sessão anterior), também é importante avaliar a necessidade de transformar as variáveis preditoras em um modelo de regressão linear múltipla. A transformação de Box-Tidwell é uma técnica que permite lidar com variáveis independentes que não exibem uma relação linear adequada com a variável dependente. Essa transformação é particularmente útil quando a relação entre uma variável preditora contínua e a variável dependente não é linear, mas pode ser tornada linear através de uma transformação adequada.

O que é a Transformação de Box-Tidwell?

A Transformação de Box-Tidwell é uma técnica que consiste em aplicar uma transformação específica a uma variável preditora contínua, geralmente a variável independente com uma relação não linear com a variável dependente, a fim de tornar a relação linear. A transformação é feita através de uma função específica, que é determinada pelos logaritmos naturais da variável preditora e da variável dependente.

  1. Identificação da Variável a Ser Transformada: Primeiro, identificamos a variável preditora que exibe uma relação não linear com a variável dependente e que pode se beneficiar da transformação.

  2. Cálculo dos Logaritmos Naturais: Calculamos o logaritmo natural da variável preditora e da variável dependente.

  3. Regressão Linear: Realizamos uma regressão linear entre o logaritmo natural da variável dependente (log(y)) e a variável preditora transformada (log(x)).

  4. Avaliação dos Coeficientes: A inclinação (coeficiente) da variável preditora transformada na regressão linear fornece informações sobre a relação entre a variável preditora original e a variável dependente. O coeficiente deve ser interpretado com base nos logaritmos naturais das variáveis originais.

modelo_numStep4 <- boxTidwell(total_freight_boxcox ~ product_weight_g+volume+dist+tempoEntregaNum+qty_product+total_price, other.x=~ factor(periodo_ano_estima_entrega), data=dfNum)
modelo_numStep4
##                  MLE of lambda Score Statistic (t)  Pr(>|t|)    
## product_weight_g       0.55142             -49.198 < 2.2e-16 ***
## volume                 1.20836              11.756 < 2.2e-16 ***
## dist                   0.35354            -112.159 < 2.2e-16 ***
## tempoEntregaNum       -0.63776             -25.596 < 2.2e-16 ***
## qty_product            0.11925             -55.778 < 2.2e-16 ***
## total_price            0.37544             -50.376 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## iterations =  8 
## 
## Score test for null hypothesis that all lambdas = 1:
## F = 4625.8, df = 6 and 94979, Pr(>F) = < 2.2e-16
dfNum$product_weight_g_boxTidwell <- (dfNum$product_weight_g^0.55142 - 1)/0.55142
dfNum$volume_boxTidwell <- (dfNum$volume^1.20836 - 1)/1.20836
dfNum$dist_boxTidwell <- (dfNum$dist^0.35354 - 1)/0.35354
dfNum$tempoEntregaNum_boxTidwell <- (dfNum$tempoEntregaNum^(-0.63776) - 1)/(-0.63776)
dfNum$qty_product_boxTidwell <- (dfNum$qty_product^0.11925 - 1)/0.11925
dfNum$total_price_boxTidwell <- (dfNum$total_price^0.37544 - 1)/0.37544

Considerações Importantes

  • Ajuda a linearizar relações não lineares entre variáveis preditoras contínuas e a variável dependente.
  • Pode melhorar a interpretabilidade dos resultados ao tornar a relação mais próxima de uma relação linear.
  • A transformação de Box-Tidwell deve ser realizada após uma análise cuidadosa dos dados, incluindo a identificação de relações não lineares.
  • É importante lembrar que, após a transformação, a interpretação dos coeficientes no contexto das variáveis originais deve ser feita considerando os logaritmos naturais.
  • Essa transformação pode ser aplicada apenas a variáveis contínuas. Variáveis categóricas não são adequadas para essa técnica.

A transformação de Box-Tidwell é uma ferramenta útil para tornar as relações entre variáveis preditoras contínuas e a variável dependente mais adequadas à regressão linear. Ela pode ser uma abordagem eficaz para melhorar o ajuste do modelo e a interpretabilidade dos resultados. No entanto, é fundamental realizar essa transformação com base na compreensão do domínio e nas características dos dados.

Partindo do modelo de regressao linear multipla que teve o melhor R2 Ajustado e menor Sigma2, que foi o modelo 3b (com y transformado por box-cox e sem as observações cujo R.stud em modulo seja maior que 2), foi feita mais uma tentativa, agora transformando as variaveis preditoras. Será chamado no texto de Modelo 4.

modelo_num5 <- lm(total_freight_boxcox ~ product_weight_g_boxTidwell+volume_boxTidwell+dist_boxTidwell+tempoEntregaNum_boxTidwell+qty_product_boxTidwell+total_price_boxTidwell+factor(periodo_ano_estima_entrega)+total_price_boxTidwell:factor(periodo_ano_estima_entrega)+volume_boxTidwell:factor(periodo_ano_estima_entrega), data=dfNum)
modelo_numStep6 <- update(modelo_num5, subset = -a.r.stud)
modelo_numStep7 <- step(modelo_numStep6, direction = 'both',  k = log(n))
## Start:  AIC=-355881.7
## total_freight_boxcox ~ product_weight_g_boxTidwell + volume_boxTidwell + 
##     dist_boxTidwell + tempoEntregaNum_boxTidwell + qty_product_boxTidwell + 
##     total_price_boxTidwell + factor(periodo_ano_estima_entrega) + 
##     total_price_boxTidwell:factor(periodo_ano_estima_entrega) + 
##     volume_boxTidwell:factor(periodo_ano_estima_entrega)
## 
##                                                             Df Sum of Sq    RSS
## <none>                                                                   1781.9
## - total_price_boxTidwell:factor(periodo_ano_estima_entrega)  3      0.75 1782.6
## - volume_boxTidwell:factor(periodo_ano_estima_entrega)       3      3.43 1785.3
## - tempoEntregaNum_boxTidwell                                 1     29.11 1811.0
## - product_weight_g_boxTidwell                                1    349.56 2131.5
## - qty_product_boxTidwell                                     1   1037.02 2818.9
## - dist_boxTidwell                                            1   1857.90 3639.8
##                                                                 AIC
## <none>                                                      -355882
## - total_price_boxTidwell:factor(periodo_ano_estima_entrega) -355878
## - volume_boxTidwell:factor(periodo_ano_estima_entrega)      -355742
## - tempoEntregaNum_boxTidwell                                -354425
## - product_weight_g_boxTidwell                               -339660
## - qty_product_boxTidwell                                    -314326
## - dist_boxTidwell                                           -291165
summary(modelo_numStep7)$adj.r.squared 
## [1] 0.8053689
summary(modelo_numStep7)
## 
## Call:
## lm(formula = total_freight_boxcox ~ product_weight_g_boxTidwell + 
##     volume_boxTidwell + dist_boxTidwell + tempoEntregaNum_boxTidwell + 
##     qty_product_boxTidwell + total_price_boxTidwell + factor(periodo_ano_estima_entrega) + 
##     total_price_boxTidwell:factor(periodo_ano_estima_entrega) + 
##     volume_boxTidwell:factor(periodo_ano_estima_entrega), data = dfNum, 
##     subset = -a.r.stud)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.60894 -0.08482 -0.00036  0.08566  0.65741 
## 
## Coefficients:
##                                                                  Estimate
## (Intercept)                                                     1.449e+00
## product_weight_g_boxTidwell                                     1.248e-03
## volume_boxTidwell                                               1.999e-07
## dist_boxTidwell                                                 1.586e-03
## tempoEntregaNum_boxTidwell                                      1.157e-01
## qty_product_boxTidwell                                          4.041e-01
## total_price_boxTidwell                                          9.922e-03
## factor(periodo_ano_estima_entrega)2 Tri                         1.637e-02
## factor(periodo_ano_estima_entrega)3 Tri                         3.121e-02
## factor(periodo_ano_estima_entrega)4 Tri                        -7.191e-03
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)2 Tri  4.232e-04
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)3 Tri  1.424e-03
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)4 Tri  4.594e-04
## volume_boxTidwell:factor(periodo_ano_estima_entrega)2 Tri      -2.509e-09
## volume_boxTidwell:factor(periodo_ano_estima_entrega)3 Tri       7.431e-08
## volume_boxTidwell:factor(periodo_ano_estima_entrega)4 Tri       2.468e-08
##                                                                Std. Error
## (Intercept)                                                     3.823e-03
## product_weight_g_boxTidwell                                     9.360e-06
## volume_boxTidwell                                               5.581e-09
## dist_boxTidwell                                                 5.159e-06
## tempoEntregaNum_boxTidwell                                      3.006e-03
## qty_product_boxTidwell                                          1.760e-03
## total_price_boxTidwell                                          1.939e-04
## factor(periodo_ano_estima_entrega)2 Tri                         3.136e-03
## factor(periodo_ano_estima_entrega)3 Tri                         3.104e-03
## factor(periodo_ano_estima_entrega)4 Tri                         3.613e-03
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)2 Tri  2.505e-04
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)3 Tri  2.484e-04
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)4 Tri  2.880e-04
## volume_boxTidwell:factor(periodo_ano_estima_entrega)2 Tri       6.704e-09
## volume_boxTidwell:factor(periodo_ano_estima_entrega)3 Tri       6.809e-09
## volume_boxTidwell:factor(periodo_ano_estima_entrega)4 Tri       7.645e-09
##                                                                t value Pr(>|t|)
## (Intercept)                                                    378.924  < 2e-16
## product_weight_g_boxTidwell                                    133.323  < 2e-16
## volume_boxTidwell                                               35.824  < 2e-16
## dist_boxTidwell                                                307.364  < 2e-16
## tempoEntregaNum_boxTidwell                                      38.470  < 2e-16
## qty_product_boxTidwell                                         229.633  < 2e-16
## total_price_boxTidwell                                          51.176  < 2e-16
## factor(periodo_ano_estima_entrega)2 Tri                          5.222 1.78e-07
## factor(periodo_ano_estima_entrega)3 Tri                         10.055  < 2e-16
## factor(periodo_ano_estima_entrega)4 Tri                         -1.990  0.04657
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)2 Tri   1.690  0.09106
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)3 Tri   5.734 9.83e-09
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)4 Tri   1.595  0.11069
## volume_boxTidwell:factor(periodo_ano_estima_entrega)2 Tri       -0.374  0.70824
## volume_boxTidwell:factor(periodo_ano_estima_entrega)3 Tri       10.913  < 2e-16
## volume_boxTidwell:factor(periodo_ano_estima_entrega)4 Tri        3.229  0.00124
##                                                                   
## (Intercept)                                                    ***
## product_weight_g_boxTidwell                                    ***
## volume_boxTidwell                                              ***
## dist_boxTidwell                                                ***
## tempoEntregaNum_boxTidwell                                     ***
## qty_product_boxTidwell                                         ***
## total_price_boxTidwell                                         ***
## factor(periodo_ano_estima_entrega)2 Tri                        ***
## factor(periodo_ano_estima_entrega)3 Tri                        ***
## factor(periodo_ano_estima_entrega)4 Tri                        *  
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)2 Tri .  
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)3 Tri ***
## total_price_boxTidwell:factor(periodo_ano_estima_entrega)4 Tri    
## volume_boxTidwell:factor(periodo_ano_estima_entrega)2 Tri         
## volume_boxTidwell:factor(periodo_ano_estima_entrega)3 Tri      ***
## volume_boxTidwell:factor(periodo_ano_estima_entrega)4 Tri      ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1402 on 90608 degrees of freedom
## Multiple R-squared:  0.8054, Adjusted R-squared:  0.8054 
## F-statistic: 2.5e+04 on 15 and 90608 DF,  p-value: < 2.2e-16
summary(modelo_numStep7)$sigma^2   
## [1] 0.01966606

Neste modelo, com tanto as variaveis explicativas quanto a variavel dependente transformada, chega-se a um R2 Ajustado de 0.805 e um sigma2 de 0.0197, sendo desta maneira os melhores indicares até o momento.

Teste de Normalidade dos Resíduos

Mais uma vez é necessário testar a normalidade dos resíduos obtidos a partir do modelo 4. Obtem-se um QQPlot com uma aparencia mais ajustada, porém com as extremidades ainda descoladas. E ao realizar o teste de Kolmogorov-Smirnov, segue-se rejeitando a hipótese nula de normalidade dos residuos

residuos7 <- modelo_numStep7$residuals   #Calcula o vetor de residuos 
preditos7 <- predict(modelo_numStep7) #Calcula os valores preditos 
qqnorm(residuos7) ; qqline(residuos7)   #Grafico de probabilidade normal

ks.test(residuos7, "pnorm", mean=mean(residuos7), sd=sd(residuos7))
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  residuos7
## D = 0.023555, p-value < 2.2e-16
## alternative hypothesis: two-sided

Teste de Homocedacidade de Breusch-Pagan

O mesmo foi necessario fazer para homocedacidade. O gráfico de Ajustados vs. Residuos, segue com a mesma aparencia de nuvem com uma leve impressão de que a variância aumenta na região central do gráfico, e depois reduz novamente. O teste de Breusch-Pagan serve para ratificar a impressão visual e confirmar a heterocedacidade.

plot(preditos7, residuos7, main="Ajustados vs. Residuos")  
abline(h=0)

bptest(modelo_numStep7) 
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_numStep7
## BP = 7810.9, df = 15, p-value < 2.2e-16

Conclusão

Conclui-se que mesmo testando diversas técnicas o frete não se relaciona linearmente com as demais variáveis, e há ressalvas quanto ao uso dos modelos propostos para previsão do frete de um novo pedido realizado neste market place. O melhor modelo obtido do ponto de vista de explicabilidade das variveis e redução do termo do erro, tem uma interpretação extremamente complexa, e é muito dificil para um ser humano médio interpretar como um grama adicional ou um cm3 adicional em produto comprado, vai impactar em reais no valor do frete. Mesmo com os ganhos do ponto de vista matemático, para o uso corriqueiro e nao automatizado, recomenda-se o uso do modelo 1. Caso seja possível automatizar a entrada de dados e transformar para visualização em reais diretos, aí sim, utiliza-se o modelo 4, ambos com ressalvas.